package br.com.leopard.erp.gym.bean.usuario;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;

import br.com.leopard.erp.gym.bean.generic.AbstractCRUDBean;
import br.com.leopard.erp.gym.mapeamento.base_sistema.Perfil;
import br.com.leopard.erp.gym.mapeamento.base_sistema.Usuario;
import br.com.leopard.erp.gym.mapeamento.empresa.Empresa;
import br.com.leopard.erp.gym.negocio.PerfilNegocio;
import br.com.leopard.erp.gym.negocio.UsuarioNegocio;
import br.com.leopard.erp.gym.negocio.empresa.EmpresaNegocio;
import br.com.leopard.erp.gym.session.UsuarioSession;
import br.com.leopard.erp.gym.web.util.JSFMessageUtil;

@ManagedBean
@ViewScoped
public class UsuarioBean extends AbstractCRUDBean<Usuario, Long> {

	@Inject
	private UsuarioNegocio usuarioNegocio;

	@Inject
	private EmpresaNegocio empresaNegocio;

	@Inject
	private PerfilNegocio perfilNegocio;

	@Inject
	private UsuarioSession usuarioSession;

	private List<Perfil> perfisDisponiveisEmpresa;

	private List<Empresa> empresaList;

	private boolean empresaRendered;

	public UsuarioBean() {
		super(Usuario.class);
	}

	@PostConstruct
	private void init() {
		super.setNegocio(usuarioNegocio);
		empresaRendered = usuarioSession.isEmpresaAdministradora();
	}

	public void procedimentosAntesAcessarCRUD() {
		empresaList = null;
		perfisDisponiveisEmpresa = null;

		if (usuarioSession.isUsuarioMaster() || usuarioSession.isEmpresaAdministradora()) {
			empresaList = empresaNegocio.listAll();
		} else {
			empresaList = new ArrayList<Empresa>();
			empresaList.add(usuarioSession.getUsuarioLogado().getEmpresa());

			getRegistroSelecionado().setEmpresa(usuarioSession.getUsuarioLogado().getEmpresa());
		}

		if (getRegistroSelecionado().getEmpresa() != null) {
			atualizarPerfisAjaxEvent(null);
		}
	}

	public void atualizarPerfisAjaxEvent(AjaxBehaviorEvent event) {
		perfisDisponiveisEmpresa = perfilNegocio.listarPerfisAtivosPorEmpresa(getRegistroSelecionado().getEmpresa());

		if (getRegistroSelecionado().getIdUsuario() == null) {
			getRegistroSelecionado().setPerfil(null);
		}

		if (perfisDisponiveisEmpresa.isEmpty()) {
			JSFMessageUtil.sendWarnMessageToUser("Nenhum perfil associado a esta empresa!");
		}
	}

	public boolean isInputPasswordRendered() {
		return !getRegistroSelecionado().isSenhaGeradaAutomaticamente() && isCamposSenhaRendered();
	}

	public boolean isCamposSenhaRendered() {
		if (this.getRegistroSelecionado().getIdUsuario() == null) {
			return true;
		}

		return false;
	}

	public List<Perfil> getPerfisDisponiveisEmpresa() {
		return perfisDisponiveisEmpresa;
	}

	public List<Empresa> getEmpresaList() {
		return empresaList;
	}

	public boolean isEmpresaRendered() {
		return empresaRendered;
	}

	public boolean isComboPerfilRendered() {
		return perfisDisponiveisEmpresa == null || perfisDisponiveisEmpresa.isEmpty() ? false : true;
	}

	public boolean isComboEmpresaDisabled() {
		if (this.getRegistroSelecionado().getIdUsuario() == null) {
			return false;
		}

		return true;
	}
}